<#include "EntityCommonVisit.ftl">
package ${packageName};

import org.apache.commons.lang3.exception.ExceptionUtils;

import org.jow.core.db.DBConsts;
import org.jow.core.OutputStream;
import org.jow.core.Port;
import org.jow.core.Record;
import org.jow.core.support.SysException;
import org.jow.common.db.DB;
<#if isCross>
import org.jow.common.entrepot.Entrepot;
</#if>
import org.jow.core.support.log.LogCore;
import ${superClassPackage}.${superClassName};
import org.jow.core.gen.JowGenFile;

@JowGenFile
public final class ${entityName} extends ${superClassName} {
	
	public static final String tableName = "${tableName?lower_case}";

	/**
	 * 属性关键字
	 */
	public static final class K <#if hasSuper>extends SuperK </#if>{
		<#list fields as field>
		/** ${field.comment} */
		public static final String ${field.name} = "${field.name}";
		</#list>
	}

	@Override
	public String getTableName() {
		return tableName;
	}
	
	public ${entityName}() {
		super();
	<#list fields as field>
		<#if field.defaults??>
			<#if field.type == "String">
		set${field.name?cap_first}("${field.defaults}");
			<#else>
		set${field.name?cap_first}(${field.defaults});
			</#if>
		</#if>
	</#list>
	}

	public ${entityName}(Record record) {
		super(record);
	<#list fields as field>
		<#if field.isTransient>
		<#if field.defaults??>
			<#if field.type == "String">
		set${field.name?cap_first}("${field.defaults}");
			<#else>
		set${field.name?cap_first}(${field.defaults});
			</#if>
		</#if>
		</#if>
	</#list>
	}

	/**
	 * 新增数据
	 */
	@Override
	public void persist() {
		// 状态错误
		if(record.getStatus() != DBConsts.RECORD_STATUS_NEW) {
			LogCore.db.error("只有新增包能调用persist函数，请确认状态：data={}, stackTrace={}", this, ExceptionUtils.getStackTrace(new Throwable()));
			return;
		}
		
		<#if isCross>
		// 如果是跨服服务器，则使用别的方式存储数据
		if (Entrepot.isCross(this, getTableName(), getField(getHumanKey()))) {
			// 重置状态
			record.resetStatus();
			return;
		}
		</#if>
		
		<#if !readOnly>
		DB prx = DB.newInstance(getTableName());
		prx.insert(record);
		
		// 重置状态
		record.resetStatus();
		</#if>
	}

	/**
	 * 同步修改数据至DB服务器
	 * 默认不立即持久化到数据库
	 */
	@Override
	public void update() {
		update(false);
	}
	
	/**
	 * 同步修改数据至DB服务器
	 * @param sync 是否立即同持久化到数据库
	 */
	@Override
	public void update(boolean sync) {
		<#if !readOnly>
		// 新增包不能直接调用update函数 请先调用persist
		if(record.getStatus() == DBConsts.RECORD_STATUS_NEW) {
			throw new SysException("新增包不能直接调用update函数，请先调用persist：data={}", this);
		}
		
		// 升级包
		try(OutputStream patch = record.patchUpdateGen()) {
			if(patch == null || patch.getLength() == 0) {
				return;
			}
	
			// 将升级包同步至DB服务器
			DB prx = DB.newInstance(getTableName());
			prx.update(getId(), patch.getChunk(), sync);
		}
		
		// 重置状态
		record.resetStatus();
		</#if>
	}

	/**
	 * 删除数据
	 */
	@Override
	public void remove() {
		<#if isCross>
		// 如果是跨服服务器，则使用别的方式存储数据
		if (Entrepot.isCross(this, getTableName(), getField(getHumanKey()))) {
			return;
		}
		</#if>
		
		// 新建的记录，尚未存盘，直接返回
		if(record.getStatus() == DBConsts.RECORD_STATUS_NEW) {
			return;
		}
		
		<#if !readOnly>
		DB prx = DB.newInstance(getTableName());
		prx.delete(getId());
		</#if>
	}

	/**
	 * 获取指定字段值
	 * 
	 * @param key
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T> T getField(String key) {
		Object value = null;
		if (key == null) {
			return (T) value;
		}
		switch (key) {
		<#list fields as field>
			case K.${field.name}: {
			<#if field.type!="boolean">
				value = get${field.name?cap_first}();
			<#else>
			<#-- *************布尔类型进行特殊处理 独有的属性调用函数*********** -->
				value = is${field.name?cap_first}();
			</#if>
				break;
			}
		</#list>
			default: break;
		}
		
		return (T) value;
	}
	
	public void setField(String key, Object value) {
		if (key == null) {
			return;
		}

		switch (key) {
		<#list fields as field>
			case K.${field.name}: {
				set${field.name?cap_first}((${field.type}) value);
				break;
			}
		</#list>
			default: break;
		}
	}

	<#-- get和set方法 -->
	<@getAndSetField fields=fields/>
	
	<#-- 只有跨服代码段里使用的private方法 -->
	<#if isCross>
	private String getHumanKey() {
		return "${humanKey}";
	}
	</#if>

}